/**
 * Copyright (C) 2011 the author
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.linguamathematica.oa4j;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import static java.lang.String.format;

import static java.util.Arrays.asList;

/**
 * The Class Base.
 */
class Base
{

	/**
	 * Ensure.
	 * 
	 * @param condition
	 *            the condition
	 * @param format
	 *            the format
	 * @param arguments
	 *            the arguments
	 */
	static void ensure(final boolean condition, final String format, final Object... arguments)
	{
		if (!condition)
		{
			throw new IllegalArgumentException(format(format, arguments));
		}
	}

	static void ensureState(final boolean condition, final String format, final Object... arguments)
	{
		if (!condition)
		{
			throw new IllegalStateException(format(format, arguments));
		}
	}

	/**
	 * Ensure not null.
	 * 
	 * @param object
	 *            the object
	 * @param argumentName
	 *            the argument name
	 */
	static void ensureNotNull(final Object object, final String argumentName)
	{
		if (object == null)
		{
			throw new NullPointerException(format("%s cannot be null", argumentName));
		}
	}

	/**
	 * Ensure response.
	 * 
	 * @param condition
	 *            the condition
	 * @param message
	 *            the message
	 * @param httpStatus
	 *            the http status
	 * @param reason
	 *            the reason
	 */
	static void ensureResponse(final boolean condition, final String message, final int httpStatus, final String reason)
	{
		if (!condition)
		{
			throw new ResponseException(message, httpStatus, reason);
		}
	}

	/**
	 * New map.
	 * 
	 * @param <K>
	 *            the key type
	 * @param <V>
	 *            the value type
	 * @return the map
	 */
	static <K, V> Map<K, V> newMap()
	{
		return new HashMap<K, V>();
	}

	/**
	 * New set.
	 * 
	 * @param <T>
	 *            the generic type
	 * @return the sets the
	 */
	static <T> Set<T> newSet()
	{
		return new HashSet<T>();
	}

	/**
	 * New set.
	 * 
	 * @param <T>
	 *            the generic type
	 * @param first
	 *            the first
	 * @param others
	 *            the others
	 * @return the sets the
	 */
	static <T> Set<T> newSet(final T first, final T... others)
	{
		final Set<T> set = new HashSet<T>();
		set.add(first);
		set.addAll(asList(others));

		return set;
	}

}
